package config

import (
	"bufio"
	"fmt"
	"os"
	"regexp"
	"strings"
)

// loadEnv 从 .env.template 文件加载环境变量到当前进程
func loadEnv(filename string) error {
	file, err := os.Open(filename)
	if err != nil {
		// 如果文件不存在（例如在CI环境中），不报错
		if os.IsNotExist(err) {
			fmt.Println(".env.template file not found, proceeding with system environment variables.")
			return nil
		}
		return fmt.Errorf("failed to open .env.template file: %w", err)
	}
	defer func(file *os.File) {
		err := file.Close()
		if err != nil {

		}
	}(file)

	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		line := strings.TrimSpace(scanner.Text())
		// 跳过空行和注释行
		if line == "" || strings.HasPrefix(line, "#") {
			continue
		}

		parts := strings.SplitN(line, "=", 2)
		if len(parts) != 2 {
			fmt.Printf("Invalid line in .env.template: %s\n", line)
			continue
		}

		key := strings.TrimSpace(parts[0])
		value := strings.TrimSpace(parts[1])
		// 将值设置到当前进程的环境变量中
		err := os.Setenv(key, value)
		if err != nil {
			return err
		}
	}

	if err := scanner.Err(); err != nil {
		return fmt.Errorf("error reading .env.template file: %w", err)
	}

	fmt.Println("Successfully loaded environment variables from .env.template file.")
	return nil
}

// generateConfig 根据模板和环境变量生成最终的 config.yaml
func generateConfig(templatePath, outputPath string) error {
	// 读取模板文件内容
	templateContent, err := os.ReadFile(templatePath)
	if err != nil {
		return fmt.Errorf("failed to read template file: %w", err)
	}

	// 定义正则表达式匹配 ${VAR_NAME}
	re := regexp.MustCompile(`\$\{([A-Za-z0-9_]+)}`)

	// 替换所有占位符
	outputContent := re.ReplaceAllStringFunc(string(templateContent), func(match string) string {
		// match 是 "${VAR_NAME}"，submatch[1] 是 "VAR_NAME"
		envName := re.FindStringSubmatch(match)[1]
		// 从环境变量中获取值
		envValue := os.Getenv(envName)
		if envValue == "" {
			fmt.Printf("Warning: Environment variable %s is not set, placeholder %s will remain.\n", envName, match)
			// 如果环境变量未设置，保留原始占位符，这通常会导致程序后续出错，便于调试
			return match
		}
		return envValue
	})

	// 写入到输出文件
	err = os.WriteFile(outputPath, []byte(outputContent), 0644)
	if err != nil {
		return fmt.Errorf("failed to write config file: %w", err)
	}

	fmt.Printf("Successfully generated config file: %s\n", outputPath)
	return nil
}

func BuildConfig() {
	// 步骤 1: 加载 .env
	err := loadEnv(".env")
	if err != nil {
		fmt.Printf("Error loading .env.template file: %v\n", err)
		os.Exit(1)
	}

	// 步骤 2: 生成 config.yaml
	err = generateConfig("config.template.yaml", "config.yaml")
	if err != nil {
		fmt.Printf("Error generating config file: %v\n", err)
		os.Exit(1)
	}

	fmt.Println("Config build process completed successfully.")
}
